package com.sd365.permission.centre.api;

import com.sd365.common.core.common.api.CommonPage;
import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import io.swagger.annotations.*;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @version 1.0
 * @ClassName: hejiale
 * @Description: 角色管理接口层，主要涉及角色的CRUD和用户、资源间的关联功能
 * @Author: Hejiale
 * @Date: 2023-08-06 17:05
 **/
@CrossOrigin
@Api(tags = "角色管理")
@RequestMapping(value = "/permission/centre/v1/role")
@Validated
@RestController
public interface RoleApi {
    /**
     * 系统启动时初始化角色资源关系，主要为网关鉴权服务
     * @return
     */
    @ApiOperation(tags = "调用接口初始化角色和资源关系",value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code = -1,message = "没有更新记录,非0码则代表失败")
    }
    )
    @PutMapping(value = "/initRoleReourceRedis")
    Boolean initRoleResourceRedis();

    /**
     * 为角色分配资源，可为多个角色分配相同的资源
     * @param roleResourceDTO
     * @return
     */
    @ApiOperation(tags = "为多角色分配多资源", value = "")
    @ApiImplicitParam(name = "roleResourceDTO",value = "角色对应资源对象",required = true,dataType = "RoleResourceDTO",paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code = -1,message = "没有更新记录,非0码则代表失败")
    }
    )
    @PostMapping(value = "/assignResource")
    Boolean assignResource(@NotNull @Valid @RequestBody RoleResourceDTO roleResourceDTO);

    /**
     * 弃用
     * 分配用户
     * @param userRoleDTO
     * @return
     */
    @ApiOperation(tags = "为多角色分配多用户", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code=-1,message = "没有更新记录,非0码则代表失败")
    }
    )
    @PostMapping(value = "/assignUser")
    Boolean assignUser(@NotNull @Valid @RequestBody UserRoleDTO userRoleDTO);

    /**
     * 未使用
     * 查询角色的资源列表
     * @param roleQuery
     * @return
     */
    @Deprecated
    @ApiOperation(tags = "根据roleId查询角色分配的资源", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code = -1,message = "没有更新记录,非0码则代表失败")
    })
    @PostMapping(value = "/resource")
    List<Node> doQueryResourceByRoleId(@NotNull @Valid
                                       @RequestBody RoleQuery roleQuery);

    /**
     * 不要求使用
     * 查询角色的公司列表
     * @return
     */
    @Deprecated
    @ApiOperation(tags = "查询角色表中包含的公司", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code = -1,message = "没有更新记录,非0码则代表失败")
    })
    @GetMapping(value = "/selectCompany")
    List<Node> selectCompany();

    /**
     * 未使用
     * 判断角色是否重复，应该使用角色码code来判断，原本是过时方法，现重启
     * @param roleDTO 角色的基本信息数据
     * @return true 该角色有 false 该角色无
     */
    @Deprecated
    @ApiOperation(tags = "验证角色是否重复", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code = -1,message = "没有更新记录,非0码则代表失败")
    })
    @PostMapping(value = "/haveName")
    boolean haveRole(@NotNull@Valid @RequestBody RoleDTO roleDTO);

    /**
     * 添加角色，不带资源，后续通过assignRoleResource来关联资源
     * @param roleDTO
     * @return
     */
    @ApiOperation(tags = "增加角色", value = "")
    @ApiImplicitParam(name = "roleDTO",value = "增加的角色",required = true,dataType = "RoleDTO",paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code = -1,message = "没有更新记录,非0码则代表失败")
    })
    @PostMapping(value = "")
    Boolean add(@NotNull @Valid @RequestBody  RoleDTO roleDTO);


    /**
     * 通过id和version来删除单个角色
     * @param id
     * @param version
     * @return
     */
    @ApiOperation(tags = "删除单个角色", value = "")
    @ApiImplicitParams({@ApiImplicitParam(name = "id",required =true,dataType = "Long",paramType = "query"),
            @ApiImplicitParam(name = "version",required =true,dataType = "Long",paramType = "query")}
    )
    @DeleteMapping(value = "")
    Boolean remove(@ApiParam(value = "当前行id", required = true) @NotNull@Valid @RequestParam("id") Long id,
                   @ApiParam(value = "当前行版本", required = true)@NotNull@Valid @RequestParam("version") Long version);

    /**
     * 批量删除角色，同时删除和用户和资源的关联关系
     * @param roleDeleteDTOS
     * @return
     */
    @ApiOperation(tags = "批量删除角色", value = "")
    @ApiImplicitParams({@ApiImplicitParam(name = "roleDTOS",required =true,dataType = "RoleDTO",paramType = "body")}
    )
    @DeleteMapping(value = "/batch")
    Boolean batchRemove(@NotNull @Valid
                        @RequestBody  RoleDeleteDTO[] roleDeleteDTOS);

    /**
     * 修改角色基本信息
     * @param roleDTO
     * @return
     */
    @ApiOperation(tags = "修改角色", value = "")
    @ApiImplicitParam(name = "roleDTO",value = "角色对象",required = true,dataType = "RoleDTO",paramType = "body")
    @PutMapping(value = "")
    Boolean modify(@NotNull @Valid @RequestBody RoleDTO roleDTO);

    /**
     * 拷贝角色
     * @param id
     * @return
     * @deprecated
     */
    @Deprecated
    @ApiOperation(tags = "拷贝角色", value = "/copy")
    @PostMapping(value = "/copy")
    RoleVO copy(@ApiParam(name = "id",type="String",required = true) @NotNull @Valid Long id);

    /**
     *  系统框架GlobalControllerResolver 类分析 参数是否 BaseQuery 类型 ，如果是则 拦截调用
     *  <br> PageHelper 分页方法， 并且将返回的page对象放入TheadLocal ，方法返回参数被 ResponseBodyAware拦截
     *  <br> 其判断 返回值的类型 如果是属于分页的请求则 自动将 List<RoleVO> 装入CommonPage
     *  <br> 并且构建统一应答回去 以上改进优化了 请求和应答的方法的编写
     * @param roleQuery 角色管理查询区域传入的对象，因为继承自BaseQuery所以自带了查询分页参数
     * @return 当前页面的角色数据，如果需要希望一页带回数据则可以在查询参数设置PageSize为大数
     */
    @ApiOperation(tags = "查询角色", value = "")
    @ApiImplicitParam(name = "roleQuery",value = "角色查询参数",required = true,dataType = "roleQuery",paramType = "query")
    @GetMapping(value = "")
    @ResponseBody
    CommonPage<RoleVO> commonQuery(@NotNull @Valid RoleQuery roleQuery);

    /**
     * 未使用
     * 在ui进行角色绑定相关用户的时候，需要弹出dialog显示用户数据，该方法返回用户列表
     * 包括资源列表
     * 可以在RoleService调用UserService或者dao完成
     * @param userQuery
     * @return
     */
    @Deprecated
    @ApiOperation(tags = "查询用户", value = "")
    @ApiImplicitParam(name = "userQuery",value = "用户查询参数",required = true,dataType = "UserQuery",paramType = "query")
    @GetMapping(value = "/commonQueryUser")
    CommonPage<UserDTO> commonQueryUser(@NotNull @Valid UserQuery userQuery);

    /**
     * 通过角色id查询角色VO数据
     * 前端复制角色所用
     * @param id
     * @return
     */
    @ApiOperation(tags = "查询角色 BY ID", value = "")
    @ApiImplicitParam(name = "id",value = "角色id",required = true,dataType = "Long",paramType = "path")
    @GetMapping(value = "/{id}")
    RoleVO queryRoleById(@NotNull @Valid  @PathVariable("id") Long id);

    /**
     * 未使用
     * 查询角色和他相关的资源
     * @param id
     * @return
     */
    @Deprecated
    @ApiOperation(tags = "查询角色资源 BY ID", value = "")
    @ApiImplicitParam(name = "id",value = "用户id",required = true,dataType = "Long",paramType = "query")
    @GetMapping(value = "/queryUserResource")
    RoleVO queryRoleResouce(@NotNull  @Valid
                             @RequestParam(value = "id", required = true) Long id);

    /**
     * 不要求使用
     * 通过角色id查询公司
     * @param id
     * @return
     */
    @Deprecated
    @ApiOperation(tags = "通过id查询角色公司关系", value = "/company")
    @ApiImplicitParam(name = "id",value = "角色id",required = true,dataType = "Long",paramType = "qeury")
    @GetMapping(value = "/company")
    RoleCompanyVO queryRoleCompanyById(@NotNull @Valid @RequestParam(value = "id") Long id);

    /**
     * 不要求使用
     * 修改角色公司关系
     * @param roleCompanyDTO
     * @return
     */
    @Deprecated
    @ApiOperation(tags = "修改角色公司关系", value = "/company")
    @ApiImplicitParam(name = "roleCompanyDTO",value = "角色公司对象",required = true,dataType = "RoleCompanyDTO",paramType = "body")
    @PutMapping(value = "/company")
    Boolean modifyRoleCompany(@NotNull @Valid @RequestBody RoleCompanyDTO roleCompanyDTO);
}
